在程式歷史的進程中,就像是動物歷史一樣,是在漫漫的演變當中前進。動物會根據環境最適者生存,程式也會慢慢演進,根據環境、硬體資源等原因逐漸找出一個pattern是最適合某個條件的。Programming paradigm 就是指總結出來經典的程式典範,主要分成兩大類指令式(Imperative programming paradigm)、宣告式(Declarative programming paradigm),裡面又會再細分不同的種類。
指令式,顧名思義就是一步步告訴程式如何運作,運用條件(if、switch)、迴圈(for)來做流程控制,會有變數(variable)來記錄狀態,這通常也是剛接觸程式所先學習到的,其優點也是可以具象化需求、容易想像也比較容易撰寫,適合入門使用。做為Java開發者最耳熟能詳的物件導向程式設計(Object oriented programming)也是屬於指令式。
宣告式/聲明式,較為抽象,相對於指令式的繁瑣,宣告式重點在於目標而不是流程。在學習這部分的時候我一直用Java角度來思考就會很難理解,這邊建議用SQL查詢來思考就單純的多,只需要SELECT * FROM 就可以查詢資料庫,不需要知道資料庫背後運作的流程與細節,還有後面會介紹到的Funtional Programming 、Reactive Programming,也都是宣告式,自己認為語言本身要有一定程度支援才能寫出宣告式的程式。
通常只看到定義還是會很難了解差異,這邊列出我整理出來的比較表
用簡單的範例來比較,有一個1~10的list,印出其中是偶數的部分,指令式透過for迴圈搭配if,聲明式透過stream、filter、forEach的方式。
public static void main(String[] args) { 
    List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
	List<Integer> result = new ArrayList<>(); 
	for (int i = 0; i < data.size(); i++) { 
        if ((data.get(i)) % 2 == 0) { 
            result.add(data.get(i)); 
        } 
	} 
	for (int i = 0; i < result.size(); i++) { 
        System.out.println(result.get(i)); 
    } 
}
public static void main(String[] args) { 
    List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
        data 
			.stream() 
			.filter(i -> i % 2 ==0) 
			.forEach(System.out::println); 
	}
本篇主要是簡單介紹一下Programming paradigm,可以在後面幫助了解Reactive Programming,指令式與宣告式這兩種沒有絕對的誰優誰劣,取決於需求與環境,下一篇會來介紹Funtional Programming。